#include "Hash.h"

Hash::Hash()
{
    this->tabela = new ItemHash * [NUM_ELEMENTOS];

    for (int i = 0; i < NUM_ELEMENTOS; i++)
    {
        this->tabela[i] = NULL;
    }
}

void Hash::inserir(Identificador *pIdentificador)
{
    int indice = getIndice(pIdentificador->getIdentificador());

	if (this->tabela[indice] == NULL)
	{
        ItemHash *item = new ItemHash();

        item->inserir(pIdentificador);

        this->tabela[indice] = item;
    }
    else
    {
        ItemHash *item = tabela[indice];
        item->inserir(pIdentificador);
    }
}

int Hash::getIndice(std::string pIdentificador)
{
	int x = 6;
	int y = 0;
	
	for (int i = 0 ; i < pIdentificador.length() ; i++)
    {
        y = x * y + ( int ) pIdentificador[i];	
	}
	
	return y % NUM_ELEMENTOS;
}

Identificador* Hash::getHash(std::string pIdentificador, std::string pProcedimento)
{
    int indice  = getIndice(pIdentificador);
    
    ItemHash *item = tabela[indice];

    return item->getIdentificador(pIdentificador, pProcedimento);
}

void Hash::exibir(std::ostream& pSaida)
{
    pSaida << "  ------------------------------------------------------------------------------- " << std::endl;
    pSaida << "   T A B E L A   D E   S I M B O L O S " << std::endl;
    pSaida << "  ------------------------------------------------------------------------------- " << std::endl;
    for (int i = 0; i < NUM_ELEMENTOS; i++)
    {
    	if (this->tabela[i] != NULL)
    	{
            ItemHash *item = tabela[i];

            item->exibir(pSaida);
            
            pSaida << std::endl;
        }
    }
}
